/*
 This file is part of wsprd.

 File name: fano.h

 Description: Header file for sequential Fano decoder.

 Copyright 1994, Phil Karn, KA9Q
 Minor modifications by Joe Taylor, K1JT
*/

#pragma once

int fano(unsigned int *metric,
         unsigned int *cycles,
         unsigned int *maxnp,
         unsigned char *data,
         unsigned char *symbols,
         unsigned int nbits,
         int mettab[2][256],
         int delta,
         unsigned int maxcycles);

int encode(unsigned char *symbols,
           unsigned char *data,
           unsigned int nbytes);

extern unsigned char Partab[];

/* Convolutional encoder macro. Takes the encoder state, generates
 * a rate 1/2 symbol pair and stores it in 'sym'. The symbol generated from
 * POLY1 goes into the 2-bit of sym, and the symbol generated from POLY2
 * goes into the 1-bit.
 */
#define ENCODE(sym, encstate)                             \
    {                                                     \
        unsigned long _tmp;                               \
        _tmp = (encstate)&POLY1;                          \
        _tmp ^= _tmp >> 16;                               \
        (sym) = Partab[(_tmp ^ (_tmp >> 8)) & 0xff] << 1; \
        _tmp = (encstate)&POLY2;                          \
        _tmp ^= _tmp >> 16;                               \
        (sym) |= Partab[(_tmp ^ (_tmp >> 8)) & 0xff];     \
    }
